import java.io.*;


public class Main {
	public static String kiiro = new String();
	public static Game g;
	public static Stickman s1;
	public static Stickman s2;
	public static void main(String[] args){
		String op="0";
		BufferedReader be = new BufferedReader(new InputStreamReader(System.in));

		while(!(op.equals("1"))&&!(op.equals("2"))){
			System.out.println("1.: Előre megírt fájlból parancs beolvasás");
			System.out.println("2.: Parancsok megadásával tesztelés");
			try {
				op=be.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}

			if(op.equals("1")){
				s1= new Stickman();
				s2= new Stickman();
				g= new Game(s1,s2);
				s1.SetGame(g);
				s2.SetGame(g);
				kiiro="";
				while(true){
					File uj = null;	//Létrehozzuk a mappát, amibe az eredményeket rakjuk
					uj=new File(System.getProperty("user.dir")+File.separator+"teszteredmeny");
					if(!uj.exists())uj.mkdir();

					System.out.println("\nA kilépéshez írja be: quit");
					System.out.println("A parancsok beolvasásához használja a");
					System.out.println("loadcommand teszt?.txt parancsot.");
					System.out.println("Az input fájlok az input mappában találhatók.");

					BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
					String input;
					try {
						input = br.readLine();
						String[] array=input.split(" ");

						if(array[0].equals("loadcommand")){
							if(array.length==2&&new File(System.getProperty("user.dir")+File.separator+"input"+File.separator+array[1]).exists()){
								loadcomm(array);
								try {
									Writer output = null;
									File file = new File(System.getProperty("user.dir")+File.separator+"teszteredmeny"+File.separator+array[1]);
									output = new BufferedWriter(new FileWriter(file));
									output.write(kiiro);
									output.close();
									System.out.println("A teszteredmény sikeresen kiíródott a "+array[1]+"nevű fájlba.");
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							else{
								System.out.println("Nem létezik ilyen fájl.");
							}

							kiiro="";
						}
						else if(array[0].equals("quit")){
							return;
						}
						else{
							System.out.println("Nem megfelelő parancs");
						}
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}
			}
			else{
				s1= new Stickman();
				s2= new Stickman();
				g= new Game(s1,s2);
				s1.SetGame(g);
				s2.SetGame(g);
				g.SetActualLevel(1);
				try {
					g.LoadLevel();
				} catch (FileNotFoundException e1) {
					System.out.println("Nem létezik ilyen fájl!");
				}

				while(true){
					System.out.println("Segítségért írja be: help.");
					System.out.println("Adja meg a következõ parancsot:");

					BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
					String input;


					kiiro="";

					try {
						input = br.readLine();

						String[] array=input.split(" ");

						if(array[0].equals("showmap")){
							showthemap();
							System.out.println(kiiro);
						}

						if(array[0].equals("tick")){
							ticking();
							System.out.println(kiiro);
						}

						if(array[0].equals("loadmap")){
							loadthemap(array);
							System.out.println(kiiro);
						}

						if(array[0].equals("playermove")){
							moveplayer(array);
							System.out.println(kiiro);
						}

						if(array[0].equals("tilemove")){
							movetile(array);
							System.out.println(kiiro);
						}
						if(array[0].equals("help")){
							showhelp();
						}
						if(array[0].equals("quit")){
							return;
						}
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}				
			}
		}
	}

	private static void loadcomm(String[] array) throws IOException {
		// TODO Auto-generated method stub
		if(array.length==2){
			FileReader fr;
			String property = System.getProperty("user.dir");
			try {
				fr = new FileReader(property+File.separator+"input"+File.separator+array[1].toString());
				BufferedReader br = new BufferedReader(fr);
				String[] comm;
				String c;
				while((c=br.readLine())!=null){
					comm=c.split(" ");
					if(comm[0].equals("showmap")){
						showthemap();
					}

					if(comm[0].equals("tick")){
						ticking();
					}

					if(comm[0].equals("loadmap")){
						loadthemap(comm);
					}

					if(comm[0].equals("playermove")){
						moveplayer(comm);
					}

					if(comm[0].equals("tilemove")){
						movetile(comm);
					}
					if(comm[0].equals("help")){
						showhelp();
					}
					if(comm[0].equals("quit")){
						return;
					}
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				System.out.println("Hiányzik egy file a parancs végrehajtásához.");
			}

		}
	}

	private static void showhelp() {
		System.out.println("-- PARANCSOK --");
		System.out.println("-- showmap --");
		System.out.println("Az aktuális szint kirajzolása.");
		System.out.println("-- tick --");
		System.out.println("A teljes programban ez valósítja meg az idõ telését,");
		System.out.println("itt mindössze a gravitáció mûködéséért felelõs, tehát");
		System.out.println("a játékosok lefele mozdulnak el a hatására.");
		System.out.println("-- loadmap szám --");
		System.out.println("Betölti a paraméterben megadott szintű pályát.");
		System.out.println("A fájlnevére példa: level1.txt.");
		System.out.println("-- playermove [stickman] [direction] --");
		System.out.println("A játékos mozgatását lehet ezzel a paranccsal");
		System.out.println("végrehajtani. s1:Elsõ játékos, s2: Másik játékos");
		System.out.println("l: balra, r:jobbra, u:fel.");
		System.out.println("-- tilemove [direction]--");
		System.out.println("A csempéket lehet ezzel a paranccsal mozgatni");
		System.out.println("a paraméterben megadott irányba.");
		System.out.println("l:balra, r:jobbra, u:fel, d:le");
		System.out.println("-- help --");
		System.out.println("Megjelennek a parancsok és leírásaik.");
		System.out.println("-- quit --");
		System.out.println("Ezzel a paranccsal lehet kilépni.");
	}


	private static void movetile(String[] array) {
		if(array.length==2){
			if(array[1].equals("[l]")){
				g.getLevel().MoveTile(3);
			}
			else if(array[1].equals("[r]")){
				g.getLevel().MoveTile(4);
			}
			else if(array[1].equals("[u]")){
				g.getLevel().MoveTile(1);
			}
			else if(array[1].equals("[d]")){
				g.getLevel().MoveTile(2);
			}
			else{
				System.out.println("Nem megfelelõ parancs.");
			}
		}
		else{
			System.out.println("Nem megfelelõ parancs.");
		}
	}


	private static void moveplayer(String[] array) {
		if(array.length==3){
			if(array[1].equals("[s1]")){
				if(array[2].equals("[l]")){
					s1.Move(3);
				}
				else if(array[2].equals("[r]")){
					s1.Move(4);
				}
				else if(array[2].equals("[u]")){
					s1.Move(1);
				}
				else{
					System.out.println("Nem megfelelõ parancs.");
				}
			}
			else if(array[1].equals("[s2]")){
				if(array[2].equals("[l]")){
					s2.Move(3);
				}
				else if(array[2].equals("[r]")){
					s2.Move(4);
				}
				else if(array[2].equals("[u]")){
					s2.Move(1);
				}
				else{
					System.out.println("Nem megfelelõ parancs.");
				}
			}
			else{
				System.out.println("Nem megfelelõ parancs.");
			}
		}

		else{
			System.out.println("Nem megfelelõ parancs!");
		}
	}


	private static void loadthemap(String[] array) throws FileNotFoundException {
		if(array.length==2){
			int szint=Integer.parseInt(array[1]);
			g.SetActualLevel(szint);
			g.LoadLevel();
		}
		else{
			System.out.println("Nem megfelelõ parancs!");
		}
	}


	private static void ticking() {
		s1.Move(2);
		s2.Move(2);
	}


	private static void showthemap() throws IOException {
		LevelElement index=g.getLevel().intelems.get(0);
		for(index=index.getEast();index.getSouth()!=null;index=index.getSouth()){
			for(LevelElement e=index;e!=null;e=e.getEast()){

				if(s1.GetLocation()==e)Main.kiiro=Main.kiiro.concat("1");
				else if(s2.GetLocation()==e)Main.kiiro=Main.kiiro.concat("2");
				else{
					if(e.getClass().toString().equals(Air.class.toString()))Main.kiiro=Main.kiiro.concat(" ");
					else if(e.getClass().toString().equals(Pit.class.toString()))Main.kiiro=Main.kiiro.concat("P");
					else if(e.getClass().toString().equals(Ground.class.toString()))Main.kiiro=Main.kiiro.concat("#");
					else if(e.getClass().toString().equals(Key.class.toString()))Main.kiiro=Main.kiiro.concat("K");
					else if(e.getClass().toString().equals(Door.class.toString()))Main.kiiro=Main.kiiro.concat("D");
					else Main.kiiro=Main.kiiro.concat("|");
				}
			}
			Main.kiiro=Main.kiiro.concat("\n");
		}
	}
}